home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-04 / bipl.zip / PROCS.ZIP / SHQUOTE.ICN < prev    next >
Text File  |  1992-09-28  |  3KB  |  106 lines

  1. ############################################################################
  2. #
  3. #    File:     shquote.icn
  4. #
  5. #    Subject:  Procedures to quote word for UNIX-like shells
  6. #
  7. #    Author:   Robert J. Alexander
  8. #
  9. #    Date:     April 2, 1991
  10. #
  11. ###########################################################################
  12. #
  13. #  The following procedures are useful for writing Icon programs that
  14. #  generate shell commands.  Certain characters cannot appear in the
  15. #  open in strings that are to be interpreted as "words" by command
  16. #  shells.  This family of procedures assists in quoting such strings so
  17. #  that they will be interpreted as single words.  Quoting characters
  18. #  are applied only if necessary -- if strings need no quoting they are
  19. #  returned unchanged.
  20. #
  21. #  shquote(s1,c1,s2) : s3 -- Produces a version of s1 which is properly
  22. #  quoted for a UNIX-type command shell. c1 is the cset of characters
  23. #  that must be quoted; s2 is the escape character. Appropriate defaults
  24. #  for omitted c1 and s2 are provided for the Bourne shell (sh).
  25. #
  26. #  cshquote(s1) : s2 -- Produces a version of s1 which is properly
  27. #  quoted for the c-shell (csh).
  28. #
  29. #  mpwquote(s1) : s2 -- Produces a version of s1 which is properly
  30. #  quoted for the Macintosh Programmer's Workshop shell (MPW Shell).
  31. #
  32. #  dequote(s1,s2) : s3 -- Produces the UNIX-style command line word s1
  33. #  with any quoting characters removed. s2 is the escape character
  34. #  required by the shell (s2 defaults the the usual UNIX escape
  35. #  character, the backslash "\\").
  36. #
  37. ############################################################################
  38.  
  39. procedure shquote(s,quotedChar,escapeChar)
  40.    /quotedChar := '\t\n\r $"#&\'()*;<>?[\\^`|'
  41.    /escapeChar := "\\"
  42.    if s ~== "" & not upto(quotedChar,s) then return s
  43.    s ? {
  44.       s := "'"
  45.       while s ||:= tab(find("'")) || "'" || escapeChar || "''" & move(1)
  46.       s ||:= tab(0) || "'"
  47.       }
  48.    return s 
  49. end
  50.  
  51. procedure cshquote(s)
  52.    s := shquote(s,'\t\n $"#&\'()*;<>?[\\`|~')
  53.    #
  54.    #  But backslashes before any bangs (!).
  55.    #
  56.    s ? {
  57.       s := ""
  58.       while s ||:= tab(find("!")) do {
  59.      s ||:= "\\" || move(1)
  60.      }
  61.       s ||:= tab(0)
  62.       }
  63.    return s
  64. end
  65.  
  66. procedure mpwquote(s)
  67.    #
  68.    #  The following are Macintosh Option- characters that have special
  69.    #  meaning to the MPW Shell.  They are represented here as Icon
  70.    #  escape sequences rather than as themselves since some
  71.    #  ASCII-oriented mailers change characters that have their
  72.    #  high-order bits set.
  73.    #
  74.    #  \xa8    circled r
  75.    #  \xb3    >= (I/O redirection)
  76.    #  \xb6    lower case delta (escape character)
  77.    #  \xb7    upper case sigma
  78.    #  \xc5    lower case phi
  79.    #  \xc7    << (I/O redirection)
  80.    #  \xc8    >> (I/O redirection)
  81.    #  \xc9    ...
  82.    #
  83.    return shquote(s,
  84.        '\0\t\n\r "#&\'()*+/;<>?[\\]`{|}\xa8\xb3\xb6\xb7\xc5\xc7\xc8\xc9',
  85.        "\xb6")
  86. end
  87.  
  88. procedure dequote(s,escapeChar)
  89.    local quoteChars,c,d
  90.    /escapeChar := "\\"
  91.    quoteChars := '"\'' ++ escapeChar
  92.    s ? {
  93.       s := ""
  94.       while s ||:= tab(upto(quoteChars)) do {
  95.          c := move(1)
  96.          if c == escapeChar then s ||:= move(1)
  97.          else {
  98.         if \d then (s ||:= d ~== c) | (d := &null)
  99.         else d := c
  100.             }
  101.          }
  102.       return s || tab(0)
  103.       }
  104. end
  105.  
  106.